-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Hash[Map[K, V]] has unnecessary constraint #3039 #3060
Hash[Map[K, V]] has unnecessary constraint #3039 #3060
Conversation
@vasiliybondarenko Adding a method to a trait breaks bincompat on Scala 2.11. Once #3051 is merged you'll be able to merge master and the bincompat check should be fine. |
Personally I'd prefer to make the old over-constrained version of the method package-private if necessary in 2.1.0 rather than add a suffix to the unbroken one, but I think the overload should be fine as long as the broken one isn't implicit, right? |
Overloading for So I assume the only solution is to add suffix to unbroken function with a proper constraint. |
2c0a30e
to
c5e5e37
Compare
Codecov Report
@@ Coverage Diff @@
## master #3060 +/- ##
==========================================
- Coverage 93.51% 93.48% -0.03%
==========================================
Files 368 368
Lines 6983 6985 +2
Branches 195 195
==========================================
Hits 6530 6530
- Misses 453 455 +2
Continue to review full report at Codecov.
|
I took the liberty of rebasing this to current master. Let's see if this works. |
MiMa still complains:
I think we'll have to add a deprecated extra constructor in there. I'll take care of it. |
Cool! Thanks |
@@ -94,7 +94,7 @@ private[instances] trait SortedSetInstancesBinCompat0 { | |||
private[instances] trait SortedSetInstancesBinCompat1 extends LowPrioritySortedSetInstancesBinCompat1 { | |||
// TODO: Remove when this is no longer necessary for binary compatibility. | |||
implicit override def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] = | |||
cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet[A] | |||
cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet1[A] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@travisbrown
Just noticed this, should this method be deprecated and un-implicit like the one above? The Todo
comment should probably be removed too?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@kailuowang What's happening here is tricky: these instances were in the wrong place (cats.instances.SortedSetInstances1
instead of cats.kernel.instances
), and now that they're in the right place these bincompat traits get the methods from both, which results in an inherits conflicting members
compiler error, which means we have to bubble overrides all the way to the top.
@@ -104,7 +104,7 @@ private[instances] trait LowPrioritySortedSetInstancesBinCompat1 | |||
cats.kernel.instances.sortedSet.catsKernelStdOrderForSortedSet[A] | |||
|
|||
override def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] = | |||
cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet[A] | |||
cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet1[A] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@travisbrown, not sure what this override is for? Can we add a comment?
import scala.collection.immutable.SortedSet | ||
|
||
trait SortedSetInstances extends SortedSetInstances1 { | ||
implicit def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] = | ||
@deprecated("Will be removed after dropping Scala 2.11 support", "") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can the deprecated message be "Use catsKernelStdHashForSortedSet1 instead", "2.1.0"
?
import scala.util.hashing.MurmurHash3._ | ||
|
||
@deprecated("Use the constructor _without_ Order instead, since Order is not required", "2.0.1") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: more likely that the derrecate version is 2.1.0
@@ -28,9 +31,13 @@ class SortedSetOrder[A: Order] extends Order[SortedSet[A]] { | |||
StaticMethods.iteratorEq(s1.iterator, s2.iterator) | |||
} | |||
|
|||
class SortedSetHash[A: Order: Hash] extends Hash[SortedSet[A]] { | |||
// FIXME use context bound in 3.x |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just curious, context bound breaks BC here (even with the deprecated constructor)?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, because it affects the constructor.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've got a branch lined up that includes @vasiliybondarenko's commit and also addresses the feedback here, simplifies things a bit, and documents the weird override
stuff. I'll open it as soon as #3125 is merged, since they overlap a lot, and that one is trivial.
Removed
Order
constraint fromHash[Map[K, V]]
but bincomp is broken. Please advise how it can be overcomeCloses #3039